package com.fcml.pattern.single;

/**
 * @author fcml
 * @date 2018/11/3
 *
 * 懒汉式：
 * 懒汉式和饿汉式的区别就是，懒汉式并非是在类加载的时候就实例化，而是等到第一次调用的时候才实例化，避免了资源的浪费。
 * 但是下面的写法是有可能出现线程安全问题的，我们可以写一个程序测试一下，请看下面的main方法。
 *
 */
public class LazySingle {
    // 私有构造
    private LazySingle(){}
    // 在本类中创建自身对象
    private static LazySingle lazySingle;

    // 提供外界访问的方法, 必须为静态方法
    public static LazySingle getHungrySingle() {
        if (lazySingle == null) {
            //测试懒汉式多线程问题
//            try {
//                Thread.sleep(2000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            lazySingle = new LazySingle();
        }
        return lazySingle;
    }

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            LazySingle lazySingle1 = LazySingle.getHungrySingle();
            System.out.println(lazySingle1);
        });
        Thread thread2 = new Thread(() -> {
            LazySingle lazySingle2 = LazySingle.getHungrySingle();
            System.out.println(lazySingle2);
        });
        // 打印上面两个LazySingle对象，发现它们的地址值并不一样。
        thread1.start();
        thread2.start();
    }
}
